package ui

// apiError 错误结构体
//  在调试模式下记录最新的错误,非调试模式则抛出错误.
type apiError struct {
	bebug bool
	erros error
}

// Error 错误处理函数
func (err *apiError) Error() string {
	if !err.bebug {
		return ""
	}
	return err.erros.Error()
}

// recover 错误拦截函数
func (err *apiError) recover() {
	if errors := recover(); errors != nil {
		if err.bebug {
			var ok bool
			if err.erros, ok = errors.(error); !ok {
				panic(errors) // 无法捕获错误
			}
		} else {
			panic(errors)
		}
	}
}

// debug 调试模式函数
func (err *apiError) debug(value bool) {
	err.bebug = value
}

// APISetDebug 设置底层调试模式状态
func APISetDebug(api interface{}, value bool) {
	if errors, ok := api.(BaseError); ok {
		errors.debug(value)
	}
}

// APIUpdateStruct 更新底层结构体
type APIUpdateStruct struct {
	call     func(in interface{})
	IsUpdate bool
}

func (api *APIUpdateStruct) isUpdate() bool {
	return api.IsUpdate
}

func (api *APIUpdateStruct) update(in interface{}) {
	if api.IsUpdate {
		api.call(in)
	}
}

// APIUpdateSetCall 设置底层更新回调
func APIUpdateSetCall(api interface{}, call func(in interface{})) {
	if update, ok := api.(*APIUpdateStruct); ok {
		update.call = call
	}
}
